package com.csw.compose.ui.module.component.base

import android.graphics.Typeface
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.ParagraphStyle
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.fromHtml
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextIndent
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
import com.csw.compose.R
import com.csw.compose.theme.pagePadding
import com.csw.compose.ui.Destination
import com.csw.compose.ui.components.BodyText
import com.csw.compose.ui.components.LabelText
import com.csw.compose.ui.components.LargeSpacer
import com.csw.compose.ui.components.MiniSpacer
import com.csw.compose.ui.components.NormalSpacer
import com.csw.compose.ui.components.OlItem
import com.csw.compose.ui.components.PrimaryTitle
import com.csw.compose.ui.components.UlItem
import com.csw.compose.ui.module.BasePage

@Preview(heightDp = 2000)
@Composable
fun TextPagePreview() {
    BasePage({}, "文本（Text）") {
        TextPage()
    }
}

class TextPageData {
    companion object : Destination("TextPage")
}

/**
 *[参考](https://developer.android.google.cn/develop/ui/compose/text?hl=zh-cn)
 */
@Composable
fun TextPage() {
    Column(
        modifier = Modifier
            .padding(horizontal = pagePadding)
            .verticalScroll(rememberScrollState())
    ) {
        PrimaryTitle("简介")
        BodyText("Text用于在界面上展示文本，作用类似于Android TextView，该有的功能都有")
        NormalSpacer()

        UlItem("Text")

        MiniSpacer()
        Text("直接设置字符串用于显示")
        Text(stringResource(R.string.text_from_resources))
        Text(buildAnnotatedString {
            append("富文本：\n")
            append("- append用于往组件追加内容")
            withStyle(style = ParagraphStyle(textIndent = TextIndent(firstLine = 20.sp))) {
                append("- withStyle用于设置样式，他基于push pop方法封装，在其作用域内的内容会应用设置的样式，支持设置段落样式(ParagraphStyle)或文本样式(SpanStyle)，段落样式不能嵌套，文本样式可以。\n")
                withStyle(style = SpanStyle(Color.Red)) {
                    append("红色")
                    withStyle(style = SpanStyle(Color.Blue)) {
                        append("蓝色")
                    }
                }
            }
            addStyle(style = SpanStyle(Color.Yellow),0,1)
            append("- addStyle用于设置某一段字符的段落样式或文本样式\n")
            append("- addLink用于设置某一段字符的为超链接")
        })
        Text(
            AnnotatedString.fromHtml(
                "<h1>网页标签</h1>"
            )
        )
        OlItem(1, "text")
        LabelText("该组件有两个方法，分别用于显示文本与富文本(自己拼接的富文本，或者使用网页标签)")

        LargeSpacer()
        PrimaryTitle("样式")
        BodyText("有诸多的属性用于文本默认样式设置，一般我们通过Material或自定义的样式来统一设置，当然也可以单独修改，以下我们简单列举常用的属性")
        Text("优先级 style < 组件样式 < 富文本样式")
        NormalSpacer()
        Text("- 使用主题预定义样式,可以通过修改主题样式配置来统一样式方案", style = MaterialTheme.typography.bodyMedium)
        OlItem(2, "style")
        LabelText("TextStyle基本包含了所有文本样式属性，一般我们以使用预定义的样式为主（方便切换暗黑模式），若有奇葩样式则再自己定义TextStyle，最后的选择才是直接修改组件属性，以便统一样式方案")

        NormalSpacer()
        Text("- 颜色", color = Color.Red)
        OlItem(3, "color")

        NormalSpacer()
        Text("- 尺寸", fontSize = 18.sp)
        OlItem(4, "fontSize")

        NormalSpacer()
        Text("- 线条粗细", fontWeight = FontWeight.Bold)
        OlItem(5, "fontWeight")

        NormalSpacer()
        Text("- 斜体", fontStyle = FontStyle.Italic)
        OlItem(6, "fontStyle")

        NormalSpacer()
        Text("- 对齐", textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth())
        OlItem(7, "textAlign")

        NormalSpacer()
        Text("- 最大行数 \n222222222222 \n333333333333", maxLines = 2)
        OlItem(8, "maxLines")

        NormalSpacer()
        Text("- 文本过长的处理方式-----------------------------------------------------------", overflow = TextOverflow.Ellipsis, maxLines = 1)
        OlItem(9, "overflow")
    }
}